package javaCode.chapter16.syn;

/**
 * @author 徐州城
 * @version 1.0
 * 模拟线程死锁
 */
public class DeadLock_ {
    public static void main(String[] args) {
        //模拟死锁的现象
        DeadLockDemo A = new DeadLockDemo(true);
        A.setName("A线程");
        DeadLockDemo B = new DeadLockDemo(false);
        B.setName("B线程");
        A.start();
        B.start();

    }
}

class DeadLockDemo extends Thread{
    static Object o1 = new Object();
    static Object o2 = new Object();
    boolean flag;

    public DeadLockDemo(boolean flag){
        this.flag = flag;
    }


    //下面业务逻辑的分析
    //1. 如果flag为 T，线程A 就会先得到/持有 o1 对象锁，然后尝试去获取 o2对象锁
    //2. 如果线程A 得不到 o2对象锁，就会Blocked
    //3. 如果flag为 F，线程B 就会先得到/持有 o2 对象锁，然后尝试去获取 o1对象锁
    //4. 如果线程A 得不到 o1对象锁，就会Blocked
    @Override
    public void run() {
        if (flag) {
            synchronized (o1) {//对象互斥锁，下面就是同步代码
                System.out.println(Thread.currentThread().getName() + "进入1");
                synchronized (o2) {//这里获取li对象的监视权
                    System.out.println(Thread.currentThread().getName() + "进入2");
                }
            }
        } else {
            synchronized (o2) {
                System.out.println(Thread.currentThread().getName() + "进入3");
                synchronized (o1){//这里监视li对象的监视权
                    System.out.println(Thread.currentThread().getName() + "进入4");
                }
            }
        }
    }

}